#include "logging.c"

void logueo(t_nodo *, int);
void loggearColaDePedidos(int *);
void loggearSectoresRecorridosLogueo(t_nodo *, int *, int *);

void logueo(t_nodo * nodoSolicitado, int descriptorArchivo){
int tiempoConsumido = 0;
int  cantSecRec = 0;
int  cantPisRec = 0;
int tamano = 0;
t_nodo * nodoSolicitadoSiguiente = 0;

log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Cola de Pedidos: ");
loggearColaDePedidos(&tamano);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, " ");
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Tamano: %d \n", tamano);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Posicion Actual: %lu:%lu \n", CHS.pista, CHS.sector);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Sector Solicitado: %lu:%lu \n", nodoSolicitado->pista, nodoSolicitado->nroSector);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Sectores Recorridos: ");
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "[" );
loggearSectoresRecorridosLogueo(nodoSolicitado, &cantSecRec, &cantPisRec);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "]");
tiempoConsumido = (cantPisRec * T_SaltoPista) + (cantSecRec * T_SaltoSector);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Tiempo Consumido: %d ms \n", tiempoConsumido);
//pthread_mutex_lock(&buffer_lock);
sem_wait(&semaforo1);
nodoSolicitadoSiguiente =algoritmoDePlanificacion();
//pthread_mutex_unlock(&buffer_lock);
sem_post(&semaforo1);

if(nodoSolicitadoSiguiente == 0){
	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Proximo Sector: ...");
}
else {
	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "Proximo Sector: %lu:%lu \n", nodoSolicitadoSiguiente->pista, nodoSolicitadoSiguiente->nroSector);
}
}

void loggearColaDePedidos(int * tamano){

//pthread_mutex_lock(&buffer_lock);
sem_wait(&semaforo1);
t_nodo * ptr = colaFte;
//pthread_mutex_unlock(&buffer_lock);
sem_post(&semaforo1);
log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "[");

while (ptr){
	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%lu:%lu,", ptr->pista, ptr->nroSector);
	(*tamano) ++;
	ptr = ptr->siguiente;
}

log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "]");
}

void loggearSectoresRecorridosLogueo(t_nodo * nodoSolicitado, int * cantSecRec, int * cantPisRec){

int salir  = 0;
*cantSecRec = 0;
*cantPisRec = 0;

//pthread_mutex_lock(&buffer_lock2);
sem_wait(&semaforo2);

log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%lu:%lu,", CHS.pista, CHS.sector);
if ((nodoSolicitado->pista == CHS.pista) && (nodoSolicitado->nroSector == CHS.sector))
	salir = 1;

else{


if (nodoSolicitado->pista >= CHS.pista) {
    while(!salir){
        while(CHS.pista != nodoSolicitado->pista){ //mientras no encuentre la pista solicitada
            if(CHS.pista == cantidadPistas - 1){
                CHS.pista = 0;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantPisRec) ++;
            }
            else {
                CHS.pista = CHS.pista + 1;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
                (*cantPisRec) ++;
            }
        }

        while(CHS.sector != nodoSolicitado->nroSector){// mientras no encuentre el sector solicitado
            if(CHS.sector == cantSecPorPista - 1){
                CHS.sector = 0;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantSecRec) ++;
            }
            else{
                CHS.sector = CHS.sector + 1;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%c%lu:%lu,",' ', CHS.pista, CHS.sector);
                (*cantSecRec) ++;
            }
            salir = 1;
        }
     }
}

else {
    while(!salir){
        while(CHS.pista != nodoSolicitado->pista){//mientras no encuentre la pista solicitada
        	CHS.pista = CHS.pista - 1;
        	log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
            (*cantPisRec) ++;
        }
        while(CHS.sector != nodoSolicitado->nroSector){//mientras no encuentre el sector solicitado
            if (CHS.sector == cantSecPorPista - 1) {
                CHS.sector = 0;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog, "%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantSecRec) ++;
            }
            else{
                CHS.sector = CHS.sector + 1;
                log_registrar (descriptorArchivo, nombreDelProceso, nivelDeLog,"%c%lu:%lu,",' ', CHS.pista, CHS.sector);
				(*cantSecRec) ++;
            }
        salir = 1;
        }
    }
}
}
//pthread_mutex_unlock(&buffer_lock2);
sem_post(&semaforo2);
}
